home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume24 / gnucalc / part03 < prev    next >
Encoding:
Text File  |  1991-10-28  |  55.3 KB  |  1,853 lines

  1. Newsgroups: comp.sources.misc
  2. From: daveg@synaptics.com (David Gillespie)
  3. Subject:  v24i051:  gnucalc - GNU Emacs Calculator, v2.00, Part03/56
  4. Message-ID: <1991Oct29.040930.6764@sparky.imd.sterling.com>
  5. X-Md4-Signature: fdd5e62069db2ae9b6bb07ec6b4e64d9
  6. Date: Tue, 29 Oct 1991 04:09:30 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: daveg@synaptics.com (David Gillespie)
  10. Posting-number: Volume 24, Issue 51
  11. Archive-name: gnucalc/part03
  12. Environment: Emacs
  13. Supersedes: gmcalc: Volume 13, Issue 27-45
  14.  
  15. ---- Cut Here and unpack ----
  16. #!/bin/sh
  17. # this is Part.03 (part 3 of a multipart archive)
  18. # do not concatenate these parts, unpack them in order with /bin/sh
  19. # file calc.el continued
  20. #
  21. if test ! -r _shar_seq_.tmp; then
  22.     echo 'Please unpack part 1 first!'
  23.     exit 1
  24. fi
  25. (read Scheck
  26.  if test "$Scheck" != 3; then
  27.     echo Please unpack part "$Scheck" next!
  28.     exit 1
  29.  else
  30.     exit 0
  31.  fi
  32. ) < _shar_seq_.tmp || exit 1
  33. if test ! -f _shar_wnt_.tmp; then
  34.     echo 'x - still skipping calc.el'
  35. else
  36. echo 'x - continuing file calc.el'
  37. sed 's/^X//' << 'SHAR_EOF' >> 'calc.el' &&
  38. X                     (cdr math-eval-rules-cache)
  39. X                     nil math-eval-rules-cache))))
  40. X            (if func
  41. X                (apply (cdr func) args)
  42. X              (and (or (consp (car a))
  43. X                   (fboundp (car a))
  44. X                   (and (not calc-extensions-loaded)
  45. X                    (calc-extensions)
  46. X                    (fboundp (car a))))
  47. X                   (apply (car a) args)))))
  48. X        (wrong-number-of-arguments
  49. X         (calc-record-why "*Wrong number of arguments"
  50. X                  (cons (car a) args))
  51. X         nil)
  52. X        (wrong-type-argument
  53. X         (or calc-next-why (calc-record-why "Wrong type of argument"
  54. X                            (cons (car a) args)))
  55. X         nil)
  56. X        (args-out-of-range
  57. X         (calc-record-why "*Argument out of range" (cons (car a) args))
  58. X         nil)
  59. X        (inexact-result
  60. X         (calc-record-why "No exact representation for result"
  61. X                  (cons (car a) args))
  62. X         nil)
  63. X        (math-overflow
  64. X         (calc-record-why "*Floating-point overflow occurred"
  65. X                  (cons (car a) args))
  66. X         nil)
  67. X        (math-underflow
  68. X         (calc-record-why "*Floating-point underflow occurred"
  69. X                  (cons (car a) args))
  70. X         nil)
  71. X        (void-variable
  72. X         (if (eq (nth 1 err) 'var-EvalRules)
  73. X             (progn
  74. X               (setq var-EvalRules nil)
  75. X               (math-normalize (cons (car a) args)))
  76. X           (calc-record-why "*Variable is void" (nth 1 err)))))
  77. X          (if (consp (car a))
  78. X          (math-dimension-error)
  79. X        (cons (car a) args)))))))
  80. )
  81. X
  82. X
  83. X
  84. ;;; True if A is a floating-point real or complex number.  [P x] [Public]
  85. (defun math-floatp (a)
  86. X  (cond ((eq (car-safe a) 'float) t)
  87. X    ((memq (car-safe a) '(cplx polar mod sdev intv))
  88. X     (or (math-floatp (nth 1 a))
  89. X         (math-floatp (nth 2 a))
  90. X         (and (eq (car a) 'intv) (math-floatp (nth 3 a)))))
  91. X    ((eq (car-safe a) 'date)
  92. X     (math-floatp (nth 1 a))))
  93. )
  94. X
  95. X
  96. X
  97. ;;; Verify that A is a complete object and return A.  [x x] [Public]
  98. (defun math-check-complete (a)
  99. X  (cond ((integerp a) a)
  100. X    ((eq (car-safe a) 'incomplete)
  101. X     (calc-incomplete-error a))
  102. X    ((consp a) a)
  103. X    (t (error "Invalid data object encountered")))
  104. )
  105. X
  106. X
  107. X
  108. ;;; Coerce integer A to be a bignum.  [B S]
  109. (defun math-bignum (a)
  110. X  (if (>= a 0)
  111. X      (cons 'bigpos (math-bignum-big a))
  112. X    (cons 'bigneg (math-bignum-big (- a))))
  113. )
  114. X
  115. (defun math-bignum-big (a)   ; [L s]
  116. X  (if (= a 0)
  117. X      nil
  118. X    (cons (% a 1000) (math-bignum-big (/ a 1000))))
  119. )
  120. X
  121. X
  122. ;;; Build a normalized floating-point number.  [F I S]
  123. (defun math-make-float (mant exp)
  124. X  (if (eq mant 0)
  125. X      '(float 0 0)
  126. X    (let* ((ldiff (- calc-internal-prec (math-numdigs mant))))
  127. X      (if (< ldiff 0)
  128. X      (setq mant (math-scale-rounding mant ldiff)
  129. X        exp (- exp ldiff))))
  130. X    (if (consp mant)
  131. X    (let ((digs (cdr mant)))
  132. X      (if (= (% (car digs) 10) 0)
  133. X          (progn
  134. X        (while (= (car digs) 0)
  135. X          (setq digs (cdr digs)
  136. X            exp (+ exp 3)))
  137. X        (while (= (% (car digs) 10) 0)
  138. X          (setq digs (math-div10-bignum digs)
  139. X            exp (1+ exp)))
  140. X        (setq mant (math-normalize (cons (car mant) digs))))))
  141. X      (while (= (% mant 10) 0)
  142. X    (setq mant (/ mant 10)
  143. X          exp (1+ exp))))
  144. X    (if (and (<= exp -4000000)
  145. X         (<= (+ exp (math-numdigs mant) -1) -4000000))
  146. X    (signal 'math-underflow nil)
  147. X      (if (and (>= exp 3000000)
  148. X           (>= (+ exp (math-numdigs mant) -1) 4000000))
  149. X      (signal 'math-overflow nil)
  150. X    (list 'float mant exp))))
  151. )
  152. X
  153. (defun math-div10-bignum (a)   ; [l l]
  154. X  (if (cdr a)
  155. X      (cons (+ (/ (car a) 10) (* (% (nth 1 a) 10) 100))
  156. X        (math-div10-bignum (cdr a)))
  157. X    (list (/ (car a) 10)))
  158. )
  159. X
  160. ;;; Coerce A to be a float.  [F N; V V] [Public]
  161. (defun math-float (a)
  162. X  (cond ((Math-integerp a) (math-make-float a 0))
  163. X    ((eq (car a) 'frac) (math-div (math-float (nth 1 a)) (nth 2 a)))
  164. X    ((eq (car a) 'float) a)
  165. X    ((memq (car a) '(cplx polar vec hms date sdev mod))
  166. X     (cons (car a) (mapcar 'math-float (cdr a))))
  167. X    (t (math-float-fancy a)))
  168. )
  169. X
  170. X
  171. (defun math-neg (a)
  172. X  (cond ((not (consp a)) (- a))
  173. X    ((eq (car a) 'bigpos) (cons 'bigneg (cdr a)))
  174. X    ((eq (car a) 'bigneg) (cons 'bigpos (cdr a)))
  175. X    ((memq (car a) '(frac float))
  176. X     (list (car a) (Math-integer-neg (nth 1 a)) (nth 2 a)))
  177. X    ((memq (car a) '(cplx vec hms date calcFunc-idn))
  178. X     (cons (car a) (mapcar 'math-neg (cdr a))))
  179. X    (t (math-neg-fancy a)))
  180. )
  181. X
  182. X
  183. ;;; Compute the number of decimal digits in integer A.  [S I]
  184. (defun math-numdigs (a)
  185. X  (if (consp a)
  186. X      (if (cdr a)
  187. X      (let* ((len (1- (length a)))
  188. X         (top (nth len a)))
  189. X        (+ (* len 3) (cond ((>= top 100) 0) ((>= top 10) -1) (t -2))))
  190. X    0)
  191. X    (cond ((>= a 100) (+ (math-numdigs (/ a 1000)) 3))
  192. X      ((>= a 10) 2)
  193. X      ((>= a 1) 1)
  194. X      ((= a 0) 0)
  195. X      ((> a -10) 1)
  196. X      ((> a -100) 2)
  197. X      (t (math-numdigs (- a)))))
  198. )
  199. X
  200. ;;; Multiply (with truncation toward 0) the integer A by 10^N.  [I i S]
  201. (defun math-scale-int (a n)
  202. X  (cond ((= n 0) a)
  203. X    ((> n 0) (math-scale-left a n))
  204. X    (t (math-normalize (math-scale-right a (- n)))))
  205. )
  206. X
  207. (defun math-scale-left (a n)   ; [I I S]
  208. X  (if (= n 0)
  209. X      a
  210. X    (if (consp a)
  211. X    (cons (car a) (math-scale-left-bignum (cdr a) n))
  212. X      (if (>= n 3)
  213. X      (if (or (>= a 1000) (<= a -1000))
  214. X          (math-scale-left (math-bignum a) n)
  215. X        (math-scale-left (* a 1000) (- n 3)))
  216. X    (if (= n 2)
  217. X        (if (or (>= a 10000) (<= a -10000))
  218. X        (math-scale-left (math-bignum a) 2)
  219. X          (* a 100))
  220. X      (if (or (>= a 100000) (<= a -100000))
  221. X          (math-scale-left (math-bignum a) 1)
  222. X        (* a 10))))))
  223. )
  224. X
  225. (defun math-scale-left-bignum (a n)
  226. X  (if (>= n 3)
  227. X      (while (>= (setq a (cons 0 a)
  228. X               n (- n 3)) 3)))
  229. X  (if (> n 0)
  230. X      (math-mul-bignum-digit a (if (= n 2) 100 10) 0)
  231. X    a)
  232. )
  233. X
  234. (defun math-scale-right (a n)   ; [i i S]
  235. X  (if (= n 0)
  236. X      a
  237. X    (if (consp a)
  238. X    (cons (car a) (math-scale-right-bignum (cdr a) n))
  239. X      (if (<= a 0)
  240. X      (if (= a 0)
  241. X          0
  242. X        (- (math-scale-right (- a) n)))
  243. X    (if (>= n 3)
  244. X        (while (and (> (setq a (/ a 1000)) 0)
  245. X            (>= (setq n (- n 3)) 3))))
  246. X    (if (= n 2)
  247. X        (/ a 100)
  248. X      (if (= n 1)
  249. X          (/ a 10)
  250. X        a)))))
  251. )
  252. X
  253. (defun math-scale-right-bignum (a n)   ; [L L S; l l S]
  254. X  (if (>= n 3)
  255. X      (setq a (nthcdr (/ n 3) a)
  256. X        n (% n 3)))
  257. X  (if (> n 0)
  258. X      (cdr (math-mul-bignum-digit a (if (= n 2) 10 100) 0))
  259. X    a)
  260. )
  261. X
  262. ;;; Multiply (with rounding) the integer A by 10^N.   [I i S]
  263. (defun math-scale-rounding (a n)
  264. X  (cond ((>= n 0)
  265. X     (math-scale-left a n))
  266. X    ((consp a)
  267. X     (math-normalize
  268. X      (cons (car a)
  269. X        (let ((val (if (< n -3)
  270. X                   (math-scale-right-bignum (cdr a) (- -3 n))
  271. X                 (if (= n -2)
  272. X                 (math-mul-bignum-digit (cdr a) 10 0)
  273. X                   (if (= n -1)
  274. X                   (math-mul-bignum-digit (cdr a) 100 0)
  275. X                 (cdr a))))))  ; n = -3
  276. X          (if (and val (>= (car val) 500))
  277. X              (if (cdr val)
  278. X              (if (eq (car (cdr val)) 999)
  279. X                  (math-add-bignum (cdr val) '(1))
  280. X                (cons (1+ (car (cdr val))) (cdr (cdr val))))
  281. X            '(1))
  282. X            (cdr val))))))
  283. X    (t
  284. X     (if (< a 0)
  285. X         (- (math-scale-rounding (- a) n))
  286. X       (if (= n -1)
  287. X           (/ (+ a 5) 10)
  288. X         (/ (+ (math-scale-right a (- -1 n)) 5) 10)))))
  289. )
  290. X
  291. X
  292. ;;; Compute the sum of A and B.  [O O O] [Public]
  293. (defun math-add (a b)
  294. X  (or
  295. X   (and (not (or (consp a) (consp b)))
  296. X    (progn
  297. X      (setq a (+ a b))
  298. X      (if (or (<= a -1000000) (>= a 1000000))
  299. X          (math-bignum a)
  300. X        a)))
  301. X   (and (Math-zerop a) (not (eq (car-safe a) 'mod))
  302. X    (if (and (math-floatp a) (Math-ratp b)) (math-float b) b))
  303. X   (and (Math-zerop b) (not (eq (car-safe b) 'mod))
  304. X    (if (and (math-floatp b) (Math-ratp a)) (math-float a) a))
  305. X   (and (Math-objvecp a) (Math-objvecp b)
  306. X    (or
  307. X     (and (Math-integerp a) (Math-integerp b)
  308. X          (progn
  309. X        (or (consp a) (setq a (math-bignum a)))
  310. X        (or (consp b) (setq b (math-bignum b)))
  311. X        (if (eq (car a) 'bigneg)
  312. X            (if (eq (car b) 'bigneg)
  313. X            (cons 'bigneg (math-add-bignum (cdr a) (cdr b)))
  314. X              (math-normalize
  315. X               (let ((diff (math-sub-bignum (cdr b) (cdr a))))
  316. X             (if (eq diff 'neg)
  317. X                 (cons 'bigneg (math-sub-bignum (cdr a) (cdr b)))
  318. X               (cons 'bigpos diff)))))
  319. X          (if (eq (car b) 'bigneg)
  320. X              (math-normalize
  321. X               (let ((diff (math-sub-bignum (cdr a) (cdr b))))
  322. X             (if (eq diff 'neg)
  323. X                 (cons 'bigneg (math-sub-bignum (cdr b) (cdr a)))
  324. X               (cons 'bigpos diff))))
  325. X            (cons 'bigpos (math-add-bignum (cdr a) (cdr b)))))))
  326. X     (and (Math-ratp a) (Math-ratp b)
  327. X          (calc-extensions)
  328. X          (calc-add-fractions a b))
  329. X     (and (Math-realp a) (Math-realp b)
  330. X          (progn
  331. X        (or (and (consp a) (eq (car a) 'float))
  332. X            (setq a (math-float a)))
  333. X        (or (and (consp b) (eq (car b) 'float))
  334. X            (setq b (math-float b)))
  335. X        (math-add-float a b)))
  336. X     (and (calc-extensions)
  337. X          (math-add-objects-fancy a b))))
  338. X   (and (calc-extensions)
  339. X    (math-add-symb-fancy a b)))
  340. )
  341. X
  342. (defun math-add-bignum (a b)   ; [L L L; l l l]
  343. X  (if a
  344. X      (if b
  345. X      (let* ((a (copy-sequence a)) (aa a) (carry nil) sum)
  346. X        (while (and aa b)
  347. X          (if carry
  348. X          (if (< (setq sum (+ (car aa) (car b))) 999)
  349. X              (progn
  350. X            (setcar aa (1+ sum))
  351. X            (setq carry nil))
  352. X            (setcar aa (+ sum -999)))
  353. X        (if (< (setq sum (+ (car aa) (car b))) 1000)
  354. X            (setcar aa sum)
  355. X          (setcar aa (+ sum -1000))
  356. X          (setq carry t)))
  357. X          (setq aa (cdr aa)
  358. X            b (cdr b)))
  359. X        (if carry
  360. X        (if b
  361. X            (nconc a (math-add-bignum b '(1)))
  362. X          (while (eq (car aa) 999)
  363. X            (setcar aa 0)
  364. X            (setq aa (cdr aa)))
  365. X          (if aa
  366. X              (progn
  367. X            (setcar aa (1+ (car aa)))
  368. X            a)
  369. X            (nconc a '(1))))
  370. X          (if b
  371. X          (nconc a b)
  372. X        a)))
  373. X    a)
  374. X    b)
  375. )
  376. X
  377. (defun math-sub-bignum (a b)   ; [l l l]
  378. X  (if b
  379. X      (if a
  380. X      (let* ((a (copy-sequence a)) (aa a) (borrow nil) sum)
  381. X        (while (and aa b)
  382. X          (if borrow
  383. X          (if (>= (setq diff (- (car aa) (car b))) 1)
  384. X              (progn
  385. X            (setcar aa (1- diff))
  386. X            (setq borrow nil))
  387. X            (setcar aa (+ diff 999)))
  388. X        (if (>= (setq diff (- (car aa) (car b))) 0)
  389. X            (setcar aa diff)
  390. X          (setcar aa (+ diff 1000))
  391. X          (setq borrow t)))
  392. X          (setq aa (cdr aa)
  393. X            b (cdr b)))
  394. X        (if borrow
  395. X        (progn
  396. X          (while (eq (car aa) 0)
  397. X            (setcar aa 999)
  398. X            (setq aa (cdr aa)))
  399. X          (if aa
  400. X              (progn
  401. X            (setcar aa (1- (car aa)))
  402. X            a)
  403. X            'neg))
  404. X          (while (eq (car b) 0)
  405. X        (setq b (cdr b)))
  406. X          (if b
  407. X          'neg
  408. X        a)))
  409. X    (while (eq (car b) 0)
  410. X      (setq b (cdr b)))
  411. X    (and b
  412. X         'neg))
  413. X    a)
  414. )
  415. X
  416. (defun math-add-float (a b)   ; [F F F]
  417. X  (let ((ediff (- (nth 2 a) (nth 2 b))))
  418. X    (if (>= ediff 0)
  419. X    (if (>= ediff (+ calc-internal-prec calc-internal-prec))
  420. X        a
  421. X      (math-make-float (math-add (nth 1 b)
  422. X                     (if (eq ediff 0)
  423. X                     (nth 1 a)
  424. X                       (math-scale-left (nth 1 a) ediff)))
  425. X               (nth 2 b)))
  426. X      (if (>= (setq ediff (- ediff))
  427. X          (+ calc-internal-prec calc-internal-prec))
  428. X      b
  429. X    (math-make-float (math-add (nth 1 a)
  430. X                   (math-scale-left (nth 1 b) ediff))
  431. X             (nth 2 a)))))
  432. )
  433. X
  434. ;;; Compute the difference of A and B.  [O O O] [Public]
  435. (defun math-sub (a b)
  436. X  (if (or (consp a) (consp b))
  437. X      (math-add a (math-neg b))
  438. X    (setq a (- a b))
  439. X    (if (or (<= a -1000000) (>= a 1000000))
  440. X    (math-bignum a)
  441. X      a))
  442. )
  443. X
  444. (defun math-sub-float (a b)   ; [F F F]
  445. X  (let ((ediff (- (nth 2 a) (nth 2 b))))
  446. X    (if (>= ediff 0)
  447. X    (if (>= ediff (+ calc-internal-prec calc-internal-prec))
  448. X        a
  449. X      (math-make-float (math-add (Math-integer-neg (nth 1 b))
  450. X                     (if (eq ediff 0)
  451. X                     (nth 1 a)
  452. X                       (math-scale-left (nth 1 a) ediff)))
  453. X               (nth 2 b)))
  454. X      (if (>= (setq ediff (- ediff))
  455. X          (+ calc-internal-prec calc-internal-prec))
  456. X      b
  457. X    (math-make-float (math-add (nth 1 a)
  458. X                   (Math-integer-neg
  459. X                    (math-scale-left (nth 1 b) ediff)))
  460. X             (nth 2 a)))))
  461. )
  462. X
  463. X
  464. ;;; Compute the product of A and B.  [O O O] [Public]
  465. (defun math-mul (a b)
  466. X  (or
  467. X   (and (not (consp a)) (not (consp b))
  468. X    (< a 1000) (> a -1000) (< b 1000) (> b -1000)
  469. X    (* a b))
  470. X   (and (Math-zerop a) (not (eq (car-safe b) 'mod))
  471. X    (if (Math-scalarp b)
  472. X        (if (and (math-floatp b) (Math-ratp a)) (math-float a) a)
  473. X      (calc-extensions)
  474. X      (math-mul-zero a b)))
  475. X   (and (Math-zerop b) (not (eq (car-safe a) 'mod))
  476. X    (if (Math-scalarp a)
  477. X        (if (and (math-floatp a) (Math-ratp b)) (math-float b) b)
  478. X      (calc-extensions)
  479. X      (math-mul-zero b a)))
  480. X   (and (Math-objvecp a) (Math-objvecp b)
  481. X    (or
  482. X     (and (Math-integerp a) (Math-integerp b)
  483. X          (progn
  484. X        (or (consp a) (setq a (math-bignum a)))
  485. X        (or (consp b) (setq b (math-bignum b)))
  486. X        (math-normalize
  487. X         (cons (if (eq (car a) (car b)) 'bigpos 'bigneg)
  488. X               (if (cdr (cdr a))
  489. X               (if (cdr (cdr b))
  490. X                   (math-mul-bignum (cdr a) (cdr b))
  491. X                 (math-mul-bignum-digit (cdr a) (nth 1 b) 0))
  492. X             (math-mul-bignum-digit (cdr b) (nth 1 a) 0))))))
  493. X     (and (Math-ratp a) (Math-ratp b)
  494. X          (calc-extensions)
  495. X          (calc-mul-fractions a b))
  496. X     (and (Math-realp a) (Math-realp b)
  497. X          (progn
  498. X        (or (and (consp a) (eq (car a) 'float))
  499. X            (setq a (math-float a)))
  500. X        (or (and (consp b) (eq (car b) 'float))
  501. X            (setq b (math-float b)))
  502. X        (math-make-float (math-mul (nth 1 a) (nth 1 b))
  503. X                 (+ (nth 2 a) (nth 2 b)))))
  504. X     (and (calc-extensions)
  505. X          (math-mul-objects-fancy a b))))
  506. X   (and (calc-extensions)
  507. X    (math-mul-symb-fancy a b)))
  508. )
  509. X
  510. (defun math-infinitep (a &optional undir)
  511. X  (while (and (consp a) (memq (car a) '(* / neg)))
  512. X    (if (or (not (eq (car a) '*)) (math-infinitep (nth 1 a)))
  513. X    (setq a (nth 1 a))
  514. X      (setq a (nth 2 a))))
  515. X  (and (consp a)
  516. X       (eq (car a) 'var)
  517. X       (memq (nth 2 a) '(var-inf var-uinf var-nan))
  518. X       (if (and undir (eq (nth 2 a) 'var-inf))
  519. X       '(var uinf var-uinf)
  520. X     a))
  521. )
  522. X
  523. ;;; Multiply digit lists A and B.  [L L L; l l l]
  524. (defun math-mul-bignum (a b)
  525. X  (and a b
  526. X       (let* ((sum (if (<= (car b) 1)
  527. X               (if (= (car b) 0)
  528. X               (list 0)
  529. X             (copy-sequence a))
  530. X             (math-mul-bignum-digit a (car b) 0)))
  531. X          (sump sum) c d aa ss prod)
  532. X     (while (setq b (cdr b))
  533. X       (setq ss (setq sump (or (cdr sump) (setcdr sump (list 0))))
  534. X         d (car b)
  535. X         c 0
  536. X         aa a)
  537. X       (while (progn
  538. X            (setcar ss (% (setq prod (+ (+ (car ss) (* (car aa) d))
  539. X                        c)) 1000))
  540. X            (setq aa (cdr aa)))
  541. X         (setq c (/ prod 1000)
  542. X           ss (or (cdr ss) (setcdr ss (list 0)))))
  543. X       (if (>= prod 1000)
  544. X           (if (cdr ss)
  545. X           (setcar (cdr ss) (+ (/ prod 1000) (car (cdr ss))))
  546. X         (setcdr ss (list (/ prod 1000))))))
  547. X     sum))
  548. )
  549. X
  550. ;;; Multiply digit list A by digit D.  [L L D D; l l D D]
  551. (defun math-mul-bignum-digit (a d c)
  552. X  (if a
  553. X      (if (<= d 1)
  554. X      (and (= d 1) a)
  555. X    (let* ((a (copy-sequence a)) (aa a) prod)
  556. X      (while (progn
  557. X           (setcar aa (% (setq prod (+ (* (car aa) d) c)) 1000))
  558. X           (cdr aa))
  559. X        (setq aa (cdr aa)
  560. X          c (/ prod 1000)))
  561. X      (if (>= prod 1000)
  562. X          (setcdr aa (list (/ prod 1000))))
  563. X      a))
  564. X    (and (> c 0)
  565. X     (list c)))
  566. )
  567. X
  568. X
  569. ;;; Compute the integer (quotient . remainder) of A and B, which may be
  570. ;;; small or big integers.  Type and consistency of truncation is undefined
  571. ;;; if A or B is negative.  B must be nonzero.  [I.I I I] [Public]
  572. (defun math-idivmod (a b)
  573. X  (if (eq b 0)
  574. X      (math-reject-arg a "*Division by zero"))
  575. X  (if (or (consp a) (consp b))
  576. X      (if (and (natnump b) (< b 1000))
  577. X      (let ((res (math-div-bignum-digit (cdr a) b)))
  578. X        (cons
  579. X         (math-normalize (cons (car a) (car res)))
  580. X         (cdr res)))
  581. X    (or (consp a) (setq a (math-bignum a)))
  582. X    (or (consp b) (setq b (math-bignum b)))
  583. X    (let ((res (math-div-bignum (cdr a) (cdr b))))
  584. X      (cons
  585. X       (math-normalize (cons (if (eq (car a) (car b)) 'bigpos 'bigneg)
  586. X                 (car res)))
  587. X       (math-normalize (cons (car a) (cdr res))))))
  588. X    (cons (/ a b) (% a b)))
  589. )
  590. X
  591. (defun math-quotient (a b)   ; [I I I] [Public]
  592. X  (if (and (not (consp a)) (not (consp b)))
  593. X      (if (= b 0)
  594. X      (math-reject-arg a "*Division by zero")
  595. X    (/ a b))
  596. X    (if (and (natnump b) (< b 1000))
  597. X    (if (= b 0)
  598. X        (math-reject-arg a "*Division by zero")
  599. X      (math-normalize (cons (car a)
  600. X                (car (math-div-bignum-digit (cdr a) b)))))
  601. X      (or (consp a) (setq a (math-bignum a)))
  602. X      (or (consp b) (setq b (math-bignum b)))
  603. X      (let* ((alen (1- (length a)))
  604. X         (blen (1- (length b)))
  605. X         (d (/ 1000 (1+ (nth (1- blen) (cdr b)))))
  606. X         (res (math-div-bignum-big (math-mul-bignum-digit (cdr a) d 0)
  607. X                       (math-mul-bignum-digit (cdr b) d 0)
  608. X                       alen blen)))
  609. X    (math-normalize (cons (if (eq (car a) (car b)) 'bigpos 'bigneg)
  610. X                  (car res))))))
  611. )
  612. X
  613. X
  614. ;;; Divide a bignum digit list by another.  [l.l l L]
  615. ;;; The following division algorithm is borrowed from Knuth vol. II, sec. 4.3.1
  616. (defun math-div-bignum (a b)
  617. X  (if (cdr b)
  618. X      (let* ((alen (length a))
  619. X         (blen (length b))
  620. X         (d (/ 1000 (1+ (nth (1- blen) b))))
  621. X         (res (math-div-bignum-big (math-mul-bignum-digit a d 0)
  622. X                       (math-mul-bignum-digit b d 0)
  623. X                       alen blen)))
  624. X    (if (= d 1)
  625. X        res
  626. X      (cons (car res)
  627. X        (car (math-div-bignum-digit (cdr res) d)))))
  628. X    (let ((res (math-div-bignum-digit a (car b))))
  629. X      (cons (car res) (list (cdr res)))))
  630. )
  631. X
  632. ;;; Divide a bignum digit list by a digit.  [l.D l D]
  633. (defun math-div-bignum-digit (a b)
  634. X  (if a
  635. X      (let* ((res (math-div-bignum-digit (cdr a) b))
  636. X         (num (+ (* (cdr res) 1000) (car a))))
  637. X    (cons
  638. X     (cons (/ num b) (car res))
  639. X     (% num b)))
  640. X    '(nil . 0))
  641. )
  642. X
  643. (defun math-div-bignum-big (a b alen blen)   ; [l.l l L]
  644. X  (if (< alen blen)
  645. X      (cons nil a)
  646. X    (let* ((res (math-div-bignum-big (cdr a) b (1- alen) blen))
  647. X       (num (cons (car a) (cdr res)))
  648. X       (res2 (math-div-bignum-part num b blen)))
  649. X      (cons
  650. X       (cons (car res2) (car res))
  651. X       (cdr res2))))
  652. )
  653. X
  654. (defun math-div-bignum-part (a b blen)   ; a < b*1000  [D.l l L]
  655. X  (let* ((num (+ (* (or (nth blen a) 0) 1000) (or (nth (1- blen) a) 0)))
  656. X     (den (nth (1- blen) b))
  657. X     (guess (min (/ num den) 999)))
  658. X    (math-div-bignum-try a b (math-mul-bignum-digit b guess 0) guess))
  659. )
  660. X
  661. (defun math-div-bignum-try (a b c guess)   ; [D.l l l D]
  662. X  (let ((rem (math-sub-bignum a c)))
  663. X    (if (eq rem 'neg)
  664. X    (math-div-bignum-try a b (math-sub-bignum c b) (1- guess))
  665. X      (cons guess rem)))
  666. )
  667. X
  668. X
  669. ;;; Compute the quotient of A and B.  [O O N] [Public]
  670. (defun math-div (a b)
  671. X  (or
  672. X   (and (Math-zerop b)
  673. X    (calc-extensions)
  674. X    (math-div-by-zero a b))
  675. X   (and (Math-zerop a) (not (eq (car-safe b) 'mod))
  676. X    (if (Math-scalarp b)
  677. X        (if (and (math-floatp b) (Math-ratp a)) (math-float a) a)
  678. X      (calc-extensions)
  679. X      (math-div-zero a b)))
  680. X   (and (Math-objvecp a) (Math-objvecp b)
  681. X    (or
  682. X     (and (Math-integerp a) (Math-integerp b)
  683. X          (let ((q (math-idivmod a b)))
  684. X        (if (eq (cdr q) 0)
  685. X            (car q)
  686. X          (if calc-prefer-frac
  687. X              (progn
  688. X            (calc-extensions)
  689. X            (math-make-frac a b))
  690. X            (math-div-float (math-make-float a 0)
  691. X                    (math-make-float b 0))))))
  692. X     (and (Math-ratp a) (Math-ratp b)
  693. X          (calc-extensions)
  694. X          (calc-div-fractions a b))
  695. X     (and (Math-realp a) (Math-realp b)
  696. X          (progn
  697. X        (or (and (consp a) (eq (car a) 'float))
  698. X            (setq a (math-float a)))
  699. X        (or (and (consp b) (eq (car b) 'float))
  700. X            (setq b (math-float b)))
  701. X        (math-div-float a b)))
  702. X     (and (calc-extensions)
  703. X          (math-div-objects-fancy a b))))
  704. X   (and (calc-extensions)
  705. X    (math-div-symb-fancy a b)))
  706. )
  707. X
  708. (defun math-div-float (a b)   ; [F F F]
  709. X  (let ((ldiff (max (- (1+ calc-internal-prec)
  710. X               (- (math-numdigs (nth 1 a)) (math-numdigs (nth 1 b))))
  711. X            0)))
  712. X    (math-make-float (math-quotient (math-scale-int (nth 1 a) ldiff) (nth 1 b))
  713. X             (- (- (nth 2 a) (nth 2 b)) ldiff)))
  714. )
  715. X
  716. X
  717. X
  718. X
  719. X
  720. ;;; Format the number A as a string.  [X N; X Z] [Public]
  721. (defun math-format-stack-value (entry)
  722. X  (setq calc-selection-cache-entry calc-selection-cache-default-entry)
  723. X  (let* ((a (car entry))
  724. X     (math-comp-selected (nth 2 entry))
  725. X     (c (cond ((null a) "<nil>")
  726. X          ((eq calc-display-raw t) (format "%s" a))
  727. X          ((stringp a) a)
  728. X          ((eq a 'top-of-stack) ".")
  729. X          (calc-prepared-composition
  730. X           calc-prepared-composition)
  731. X          ((and (Math-scalarp a)
  732. X            (memq calc-language '(nil flat unform))
  733. X            (null math-comp-selected))
  734. X           (math-format-number a))
  735. X          (t (calc-extensions)
  736. X             (math-compose-expr a 0))))
  737. X     (off (math-stack-value-offset c))
  738. X     s w)
  739. X    (and math-comp-selected (setq calc-any-selections t))
  740. X    (setq w (cdr off)
  741. X      off (car off))
  742. X    (if (> off 0)
  743. X    (setq c (math-comp-concat (make-string off ? ) c)))
  744. X    (or (equal calc-left-label "")
  745. X    (setq c (math-comp-concat (if (eq a 'top-of-stack)
  746. X                      (make-string (length calc-left-label) ? )
  747. X                    calc-left-label)
  748. X                  c)))
  749. X    (if calc-line-numbering
  750. X    (setq c (math-comp-concat (if (eq calc-language 'big)
  751. X                      (if math-comp-selected
  752. X                      '(tag t "1:  ") "1:  ")
  753. X                    "    ")
  754. X                  c)))
  755. X    (or (equal calc-right-label "")
  756. X    (eq a 'top-of-stack)
  757. X    (progn
  758. X      (calc-extensions)
  759. X      (setq c (list 'horiz c
  760. X            (make-string (max (- w (math-comp-width c)
  761. X                         (length calc-right-label)) 0) ? )
  762. X            '(break -1)
  763. X            calc-right-label))))
  764. X    (setq s (if (stringp c)
  765. X        (if calc-display-raw
  766. X            (prin1-to-string c)
  767. X          c)
  768. X          (math-composition-to-string c w)))
  769. X    (if calc-language-output-filter
  770. X    (setq s (funcall calc-language-output-filter s)))
  771. X    (if (eq calc-language 'big)
  772. X    (setq s (concat s "\n"))
  773. X      (if calc-line-numbering
  774. X      (progn
  775. X        (aset s 0 ?1)
  776. X        (aset s 1 ?:))))
  777. X    (setcar (cdr entry) (calc-count-lines s))
  778. X    s)
  779. )
  780. X
  781. (defun math-stack-value-offset (c)
  782. X  (let* ((num (if calc-line-numbering 4 0))
  783. X     (wid (calc-window-width))
  784. X     off)
  785. X    (if calc-display-just
  786. X    (progn
  787. X      (calc-extensions)
  788. X      (math-stack-value-offset-fancy))
  789. X      (setq off (or calc-display-origin 0))
  790. X      (if (integerp calc-line-breaking)
  791. X      (setq wid calc-line-breaking)))
  792. X    (cons (max (- off (length calc-left-label)) 0)
  793. X      (+ wid num)))
  794. )
  795. X
  796. (defun calc-count-lines (s)
  797. X  (let ((pos 0)
  798. X    (num 1))
  799. X    (while (setq newpos (string-match "\n" s pos))
  800. X      (setq pos (1+ newpos)
  801. X        num (1+ num)))
  802. X    num)
  803. )
  804. X
  805. (defun math-format-value (a &optional w)
  806. X  (if (and (Math-scalarp a)
  807. X       (memq calc-language '(nil flat unform)))
  808. X      (math-format-number a)
  809. X    (calc-extensions)
  810. X    (let ((calc-line-breaking nil))
  811. X      (math-composition-to-string (math-compose-expr a 0) w)))
  812. )
  813. X
  814. (defun calc-window-width ()
  815. X  (if calc-embedded-info
  816. X      (let ((win (get-buffer-window (aref calc-embedded-info 0))))
  817. X    (1- (if win (window-width win) (screen-width))))
  818. X    (- (window-width (get-buffer-window (current-buffer)))
  819. X       (if calc-line-numbering 5 1)))
  820. )
  821. X
  822. (defun math-comp-concat (c1 c2)
  823. X  (if (and (stringp c1) (stringp c2))
  824. X      (concat c1 c2)
  825. X    (list 'horiz c1 c2))
  826. )
  827. X
  828. X
  829. X
  830. ;;; Format an expression as a one-line string suitable for re-reading.
  831. X
  832. (defun math-format-flat-expr (a prec)
  833. X  (cond
  834. X   ((or (not (or (consp a) (integerp a)))
  835. X    (eq calc-display-raw t))
  836. X    (let ((print-escape-newlines t))
  837. X      (concat "'" (prin1-to-string a))))
  838. X   ((Math-scalarp a)
  839. X    (let ((calc-group-digits nil)
  840. X      (calc-point-char ".")
  841. X      (calc-frac-format (if (> (length (car calc-frac-format)) 1)
  842. X                '("::" nil) '(":" nil)))
  843. X      (calc-complex-format nil)
  844. X      (calc-hms-format "%s@ %s' %s\"")
  845. X      (calc-language nil))
  846. X      (math-format-number a)))
  847. X   (t
  848. X    (calc-extensions)
  849. X    (math-format-flat-expr-fancy a prec)))
  850. )
  851. X
  852. X
  853. X
  854. ;;; Format a number as a string.
  855. (defun math-format-number (a &optional prec)   ; [X N]   [Public]
  856. X  (cond
  857. X   ((eq calc-display-raw t) (format "%s" a))
  858. X   ((and (nth 1 calc-frac-format) (Math-integerp a))
  859. X    (calc-extensions)
  860. X    (math-format-number (math-adjust-fraction a)))
  861. X   ((integerp a)
  862. X    (if (not (or calc-group-digits calc-leading-zeros))
  863. X    (if (= calc-number-radix 10)
  864. X        (int-to-string a)
  865. X      (if (< a 0)
  866. X          (concat "-" (math-format-number (- a)))
  867. X        (calc-extensions)
  868. X        (if math-radix-explicit-format
  869. X        (if calc-radix-formatter
  870. X            (funcall calc-radix-formatter
  871. X                 calc-number-radix
  872. X                 (if (= calc-number-radix 2)
  873. X                 (math-format-binary a)
  874. X                   (math-format-radix a)))
  875. X          (format "%d#%s" calc-number-radix
  876. X              (if (= calc-number-radix 2)
  877. X                  (math-format-binary a)
  878. X                (math-format-radix a))))
  879. X          (math-format-radix a))))
  880. X      (math-format-number (math-bignum a))))
  881. X   ((stringp a) a)
  882. X   ((eq (car a) 'bigpos) (math-format-bignum (cdr a)))
  883. X   ((eq (car a) 'bigneg) (concat "-" (math-format-bignum (cdr a))))
  884. X   ((and (eq (car a) 'float) (= calc-number-radix 10))
  885. X    (if (Math-integer-negp (nth 1 a))
  886. X    (concat "-" (math-format-number (math-neg a)))
  887. X      (let ((mant (nth 1 a))
  888. X        (exp (nth 2 a))
  889. X        (fmt (car calc-float-format))
  890. X        (figs (nth 1 calc-float-format))
  891. X        (point calc-point-char)
  892. X        str)
  893. X    (if (and (eq fmt 'fix)
  894. X         (or (and (< figs 0) (setq figs (- figs)))
  895. X             (> (+ exp (math-numdigs mant)) (- figs))))
  896. X        (progn
  897. X          (setq mant (math-scale-rounding mant (+ exp figs))
  898. X            str (if (integerp mant)
  899. X                (int-to-string mant)
  900. X              (math-format-bignum-decimal (cdr mant))))
  901. X          (if (<= (length str) figs)
  902. X          (setq str (concat (make-string (1+ (- figs (length str))) ?0)
  903. X                    str)))
  904. X          (if (> figs 0)
  905. X          (setq str (concat (substring str 0 (- figs)) point
  906. X                    (substring str (- figs))))
  907. X        (setq str (concat str point)))
  908. X          (if calc-group-digits
  909. X          (setq str (math-group-float str))))
  910. X      (if (< figs 0)
  911. X          (setq figs (+ calc-internal-prec figs)))
  912. X      (if (> figs 0)
  913. X          (let ((adj (- figs (math-numdigs mant))))
  914. X        (if (< adj 0)
  915. X            (setq mant (math-scale-rounding mant adj)
  916. X              exp (- exp adj)))))
  917. X      (setq str (if (integerp mant)
  918. X            (int-to-string mant)
  919. X              (math-format-bignum-decimal (cdr mant))))
  920. X      (let* ((len (length str))
  921. X         (dpos (+ exp len)))
  922. X        (if (and (eq fmt 'float)
  923. X             (<= dpos (+ calc-internal-prec calc-display-sci-high))
  924. X             (>= dpos (+ calc-display-sci-low 2)))
  925. X        (progn
  926. X          (cond
  927. X           ((= dpos 0)
  928. X            (setq str (concat "0" point str)))
  929. X           ((and (<= exp 0) (> dpos 0))
  930. X            (setq str (concat (substring str 0 dpos) point
  931. X                      (substring str dpos))))
  932. X           ((> exp 0)
  933. X            (setq str (concat str (make-string exp ?0) point)))
  934. X           (t   ; (< dpos 0)
  935. X            (setq str (concat "0" point
  936. X                      (make-string (- dpos) ?0) str))))
  937. X          (if calc-group-digits
  938. X              (setq str (math-group-float str))))
  939. X          (let* ((eadj (+ exp len))
  940. X             (scale (if (eq fmt 'eng)
  941. X                (1+ (math-mod (+ eadj 300002) 3))
  942. X                  1)))
  943. X        (if (> scale (length str))
  944. X            (setq str (concat str (make-string (- scale (length str))
  945. X                               ?0))))
  946. X        (if (< scale (length str))
  947. X            (setq str (concat (substring str 0 scale) point
  948. X                      (substring str scale))))
  949. X        (if calc-group-digits
  950. X            (setq str (math-group-float str)))
  951. X        (setq str (format (if (memq calc-language '(math maple))
  952. X                      (if (and prec (> prec 191))
  953. X                      "(%s*10.^%d)" "%s*10.^%d")
  954. X                    "%se%d")
  955. X                  str (- eadj scale)))))))
  956. X    str)))
  957. X   (t
  958. X    (calc-extensions)
  959. X    (math-format-number-fancy a prec)))
  960. )
  961. X
  962. (defun math-format-bignum (a)   ; [X L]
  963. X  (if (and (= calc-number-radix 10)
  964. X       (not calc-leading-zeros)
  965. X       (not calc-group-digits))
  966. X      (math-format-bignum-decimal a)
  967. X    (calc-extensions)
  968. X    (math-format-bignum-fancy a))
  969. )
  970. X
  971. (defun math-format-bignum-decimal (a)   ; [X L]
  972. X  (if a
  973. X      (let ((s ""))
  974. X    (while (cdr (cdr a))
  975. X      (setq s (concat (format "%06d" (+ (* (nth 1 a) 1000) (car a))) s)
  976. X        a (cdr (cdr a))))
  977. X    (concat (int-to-string (+ (* (or (nth 1 a) 0) 1000) (car a))) s))
  978. X    "0")
  979. )
  980. X
  981. X
  982. X
  983. ;;; Parse a simple number in string form.   [N X] [Public]
  984. (defun math-read-number (s)
  985. X  (math-normalize
  986. X   (cond
  987. X
  988. X    ;; Integers (most common case)
  989. X    ((string-match "\\` *\\([0-9]+\\) *\\'" s)
  990. X     (let ((digs (math-match-substring s 1)))
  991. X       (if (and (eq calc-language 'c)
  992. X        (> (length digs) 1)
  993. X        (eq (aref digs 0) ?0))
  994. X       (math-read-number (concat "8#" digs))
  995. X     (if (<= (length digs) 6)
  996. X         (string-to-int digs)
  997. X       (cons 'bigpos (math-read-bignum digs))))))
  998. X
  999. X    ;; Clean up the string if necessary
  1000. X    ((string-match "\\`\\(.*\\)[ \t\n]+\\([^\001]\\)*\\'" s)
  1001. X     (math-read-number (concat (math-match-substring s 1)
  1002. X                   (math-match-substring s 2))))
  1003. X
  1004. X    ;; Plus and minus signs
  1005. X    ((string-match "^[-_+]\\(.*\\)$" s)
  1006. X     (let ((val (math-read-number (math-match-substring s 1))))
  1007. X       (and val (if (eq (aref s 0) ?+) val (math-neg val)))))
  1008. X
  1009. X    ;; Forms that require extensions module
  1010. X    ((string-match "[^-+0-9eE.]" s)
  1011. X     (calc-extensions)
  1012. X     (math-read-number-fancy s))
  1013. X
  1014. X    ;; Decimal point
  1015. X    ((string-match "^\\([0-9]*\\)\\.\\([0-9]*\\)$" s)
  1016. X     (let ((int (math-match-substring s 1))
  1017. X       (frac (math-match-substring s 2)))
  1018. X       (let ((ilen (length int))
  1019. X         (flen (length frac)))
  1020. X     (let ((int (if (> ilen 0) (math-read-number int) 0))
  1021. X           (frac (if (> flen 0) (math-read-number frac) 0)))
  1022. X       (and int frac (or (> ilen 0) (> flen 0))
  1023. X        (list 'float
  1024. X              (math-add (math-scale-int int flen) frac)
  1025. X              (- flen)))))))
  1026. X
  1027. X    ;; "e" notation
  1028. X    ((string-match "^\\(.*\\)[eE]\\([-+]?[0-9]+\\)$" s)
  1029. X     (let ((mant (math-match-substring s 1))
  1030. X       (exp (math-match-substring s 2)))
  1031. X       (let ((mant (if (> (length mant) 0) (math-read-number mant) 1))
  1032. X         (exp (if (<= (length exp) (if (memq (aref exp 0) '(?+ ?-)) 8 7))
  1033. X              (string-to-int exp))))
  1034. X     (and mant exp (Math-realp mant) (> exp -4000000) (< exp 4000000)
  1035. X          (let ((mant (math-float mant)))
  1036. X        (list 'float (nth 1 mant) (+ (nth 2 mant) exp)))))))
  1037. X
  1038. X    ;; Syntax error!
  1039. X    (t nil)))
  1040. )
  1041. X
  1042. (defun math-match-substring (s n)
  1043. X  (if (match-beginning n)
  1044. X      (substring s (match-beginning n) (match-end n))
  1045. X    "")
  1046. )
  1047. X
  1048. (defun math-read-bignum (s)   ; [l X]
  1049. X  (if (> (length s) 3)
  1050. X      (cons (string-to-int (substring s -3))
  1051. X        (math-read-bignum (substring s 0 -3)))
  1052. X    (list (string-to-int s)))
  1053. )
  1054. X
  1055. X
  1056. (defconst math-tex-ignore-words
  1057. X  '( ("\\hbox") ("\\mbox") ("\\text") ("\\left") ("\\right")
  1058. X     ("\\,") ("\\>") ("\\:") ("\\;") ("\\!") ("\\ ")
  1059. X     ("\\quad") ("\\qquad") ("\\hfil") ("\\hfill")
  1060. X     ("\\displaystyle") ("\\textstyle") ("\\dsize") ("\\tsize")
  1061. X     ("\\scriptstyle") ("\\scriptscriptstyle") ("\\ssize") ("\\sssize")
  1062. X     ("\\rm") ("\\bf") ("\\it") ("\\sl")
  1063. X     ("\\roman") ("\\bold") ("\\italic") ("\\slanted")
  1064. X     ("\\cal") ("\\mit") ("\\Cal") ("\\Bbb") ("\\frak") ("\\goth")
  1065. X     ("\\evalto")
  1066. X     ("\\matrix" mat) ("\\bmatrix" mat) ("\\pmatrix" mat)
  1067. X     ("\\cr" punc ";") ("\\\\" punc ";") ("\\*" punc "*")
  1068. X     ("\\{" punc "[") ("\\}" punc "]")
  1069. ))
  1070. X
  1071. (defconst math-eqn-ignore-words
  1072. X  '( ("roman") ("bold") ("italic") ("mark") ("lineup") ("evalto")
  1073. X     ("left" ("floor") ("ceil"))
  1074. X     ("right" ("floor") ("ceil"))
  1075. X     ("arc" ("sin") ("cos") ("tan") ("sinh") ("cosh") ("tanh"))
  1076. X     ("size" n) ("font" n) ("fwd" n) ("back" n) ("up" n) ("down" n)
  1077. X     ("above" punc ",")
  1078. ))
  1079. X
  1080. (defconst math-standard-opers
  1081. X  '( ( "_"     calcFunc-subscr 1200 1201 )
  1082. X     ( "%"     calcFunc-percent 1100 -1 )
  1083. X     ( "u+"    ident         -1 1000 )
  1084. X     ( "u-"    neg         -1 1000 197 )
  1085. X     ( "u!"    calcFunc-lnot -1 1000 )
  1086. X     ( "mod"   mod         400 400 185 )
  1087. X     ( "+/-"   sdev         300 300 185 )
  1088. X     ( "!!"    calcFunc-dfact 210 -1 )
  1089. X     ( "!"     calcFunc-fact 210  -1 )
  1090. X     ( "^"     ^             201 200 )
  1091. X     ( "**"    ^             201 200 )
  1092. X     ( "*"     *             196 195 )
  1093. X     ( "2x"    *             196 195 )
  1094. X     ( "/"     /             190 191 )
  1095. X     ( "%"     %             190 191 )
  1096. X     ( "\\"    calcFunc-idiv 190 191 )
  1097. X     ( "+"     +         180 181 )
  1098. X     ( "-"     -         180 181 )
  1099. X     ( "|"     |         170 171 )
  1100. X     ( "<"     calcFunc-lt   160 161 )
  1101. X     ( ">"     calcFunc-gt   160 161 )
  1102. X     ( "<="    calcFunc-leq  160 161 )
  1103. X     ( ">="    calcFunc-geq  160 161 )
  1104. X     ( "="     calcFunc-eq   160 161 )
  1105. X     ( "=="    calcFunc-eq   160 161 )
  1106. X     ( "!="    calcFunc-neq  160 161 )
  1107. X     ( "&&"    calcFunc-land 110 111 )
  1108. X     ( "||"    calcFunc-lor  100 101 )
  1109. X     ( "?"     (math-read-if) 91  90 )
  1110. X     ( "!!!"   calcFunc-pnot  -1  85 )
  1111. X     ( "&&&"   calcFunc-pand  80  81 )
  1112. X     ( "|||"   calcFunc-por   75  76 )
  1113. X     ( ":="    calcFunc-assign 51 50 )
  1114. X     ( "::"    calcFunc-condition 45 46 )
  1115. X     ( "=>"    calcFunc-evalto 40 41 )
  1116. X     ( "=>"    calcFunc-evalto 40 -1 )
  1117. ))
  1118. (setq math-expr-opers math-standard-opers)
  1119. X
  1120. X
  1121. ;;;###autoload
  1122. (defun calc-grab-region (top bot arg)
  1123. X  "Parse the region as a vector of numbers and push it on the Calculator stack."
  1124. X  (interactive "r\nP")
  1125. X  (calc-extensions)
  1126. X  (calc-do-grab-region top bot arg)
  1127. )
  1128. X
  1129. ;;;###autoload
  1130. (defun calc-grab-rectangle (top bot arg)
  1131. X  "Parse a rectangle as a matrix of numbers and push it on the Calculator stack."
  1132. X  (interactive "r\nP")
  1133. X  (calc-extensions)
  1134. X  (calc-do-grab-rectangle top bot arg)
  1135. )
  1136. X
  1137. (defun calc-grab-sum-down (top bot arg)
  1138. X  "Parse a rectangle as a matrix of numbers and sum its columns."
  1139. X  (interactive "r\nP")
  1140. X  (calc-extensions)
  1141. X  (calc-do-grab-rectangle top bot arg)
  1142. X  (if (eq major-mode 'calc-mode)
  1143. X      (calc-slow-wrapper
  1144. X       (calc-enter-result 1 "red+" (list 'calcFunc-reduced
  1145. X                     '(var add var-add)
  1146. X                     (calc-top-n 1)))))
  1147. )
  1148. X
  1149. (defun calc-grab-sum-across (top bot arg)
  1150. X  "Parse a rectangle as a matrix of numbers and sum its rows."
  1151. X  (interactive "r\nP")
  1152. X  (calc-extensions)
  1153. X  (calc-do-grab-rectangle top bot arg)
  1154. X  (if (eq major-mode 'calc-mode)
  1155. X      (calc-slow-wrapper
  1156. X       (calc-enter-result 1 "red+" (list 'calcFunc-reducea
  1157. X                     '(var add var-add)
  1158. X                     (calc-top-n 1)))))
  1159. )
  1160. X
  1161. X
  1162. ;;;###autoload
  1163. (defun calc-embedded (arg &optional end obeg oend)
  1164. X  "Start Calc Embedded mode on the formula surrounding point."
  1165. X  (interactive "P")
  1166. X  (calc-extensions)
  1167. X  (calc-do-embedded arg end obeg oend)
  1168. )
  1169. X
  1170. ;;;###autoload
  1171. (defun calc-embedded-activate (&optional arg cbuf)
  1172. X  "Scan the current editing buffer for all embedded := and => formulas.
  1173. Also looks for the equivalent TeX words, \\gets and \\evalto."
  1174. X  (interactive "P")
  1175. X  (calc-do-embedded-activate arg cbuf)
  1176. )
  1177. X
  1178. X
  1179. (defun calc-user-invocation ()
  1180. X  (interactive)
  1181. X  (or (stringp calc-invocation-macro)
  1182. X      (error "Use `Z I' inside Calc to define a `M-# Z' keyboard macro"))
  1183. X  (execute-kbd-macro calc-invocation-macro nil)
  1184. )
  1185. X
  1186. X
  1187. X
  1188. X
  1189. ;;; User-programmability.
  1190. X
  1191. ;;;###autoload
  1192. (defmacro defmath (func args &rest body)   ;  [Public]
  1193. X  (calc-extensions)
  1194. X  (math-do-defmath func args body)
  1195. )
  1196. X
  1197. X
  1198. X
  1199. (if calc-always-load-extensions
  1200. X    (progn
  1201. X      (calc-extensions)
  1202. X      (calc-load-everything))
  1203. )
  1204. X
  1205. X
  1206. (run-hooks 'calc-load-hook)
  1207. X
  1208. X
  1209. SHAR_EOF
  1210. echo 'File calc.el is complete' &&
  1211. chmod 0644 calc.el ||
  1212. echo 'restore of calc.el failed'
  1213. Wc_c="`wc -c < 'calc.el'`"
  1214. test 112529 -eq "$Wc_c" ||
  1215.     echo 'calc.el: original size 112529, current size' "$Wc_c"
  1216. rm -f _shar_wnt_.tmp
  1217. fi
  1218. # ============= calc-aent.el ==============
  1219. if test -f 'calc-aent.el' -a X"$1" != X"-c"; then
  1220.     echo 'x - skipping calc-aent.el (File already exists)'
  1221.     rm -f _shar_wnt_.tmp
  1222. else
  1223. > _shar_wnt_.tmp
  1224. echo 'x - extracting calc-aent.el (Text)'
  1225. sed 's/^X//' << 'SHAR_EOF' > 'calc-aent.el' &&
  1226. ;; Calculator for GNU Emacs, part I [calc-aent.el]
  1227. ;; Copyright (C) 1990, 1991 Free Software Foundation, Inc.
  1228. ;; Written by Dave Gillespie, daveg@csvax.cs.caltech.edu.
  1229. X
  1230. ;; This file is part of GNU Emacs.
  1231. X
  1232. ;; GNU Emacs is distributed in the hope that it will be useful,
  1233. ;; but WITHOUT ANY WARRANTY.  No author or distributor
  1234. ;; accepts responsibility to anyone for the consequences of using it
  1235. ;; or for whether it serves any particular purpose or works at all,
  1236. ;; unless he says so in writing.  Refer to the GNU Emacs General Public
  1237. ;; License for full details.
  1238. X
  1239. ;; Everyone is granted permission to copy, modify and redistribute
  1240. ;; GNU Emacs, but only under the conditions described in the
  1241. ;; GNU Emacs General Public License.   A copy of this license is
  1242. ;; supposed to have been given to you along with GNU Emacs so you
  1243. ;; can know your rights and responsibilities.  It should be in a
  1244. ;; file named COPYING.  Among other things, the copyright notice
  1245. ;; and this notice must be preserved on all copies.
  1246. X
  1247. X
  1248. X
  1249. ;; This file is autoloaded from calc.el.
  1250. (require 'calc)
  1251. X
  1252. (require 'calc-macs)
  1253. X
  1254. (defun calc-Need-calc-aent () nil)
  1255. X
  1256. X
  1257. (defun calc-do-quick-calc ()
  1258. X  (calc-check-defines)
  1259. X  (if (eq major-mode 'calc-mode)
  1260. X      (calc-algebraic-entry t)
  1261. X    (let (buf shortbuf)
  1262. X      (save-excursion
  1263. X    (calc-create-buffer)
  1264. X    (let* ((calc-command-flags nil)
  1265. X           (calc-dollar-values calc-quick-prev-results)
  1266. X           (calc-dollar-used 0)
  1267. X           (enable-recursive-minibuffers t)
  1268. X           (calc-language (if (memq calc-language '(nil big))
  1269. X                  'flat calc-language))
  1270. X           (entry (calc-do-alg-entry "" "Quick calc: " t))
  1271. X           (alg-exp (mapcar (function
  1272. X                 (lambda (x)
  1273. X                   (if (and (not calc-extensions-loaded)
  1274. X                        calc-previous-alg-entry
  1275. X                        (string-match
  1276. X                         "\\`[-0-9._+*/^() ]+\\'"
  1277. X                         calc-previous-alg-entry))
  1278. X                       (calc-normalize x)
  1279. X                     (calc-extensions)
  1280. X                     (math-evaluate-expr x))))
  1281. X                entry)))
  1282. X      (if (and (= (length alg-exp) 1)
  1283. X           (eq (car-safe (car alg-exp)) 'calcFunc-assign)
  1284. X           (= (length (car alg-exp)) 3)
  1285. X           (eq (car-safe (nth 1 (car alg-exp))) 'var))
  1286. X          (progn
  1287. X        (calc-extensions)
  1288. X        (set (nth 2 (nth 1 (car alg-exp))) (nth 2 (car alg-exp)))
  1289. X        (calc-refresh-evaltos (nth 2 (nth 1 (car alg-exp))))
  1290. X        (setq alg-exp (list (nth 2 (car alg-exp))))))
  1291. X      (setq calc-quick-prev-results alg-exp
  1292. X        buf (mapconcat (function (lambda (x)
  1293. X                       (math-format-value x 1000)))
  1294. X                   alg-exp
  1295. X                   " ")
  1296. X        shortbuf buf)
  1297. X      (if (and (= (length alg-exp) 1)
  1298. X           (memq (car-safe (car alg-exp)) '(nil bigpos bigneg))
  1299. X           (< (length buf) 20)
  1300. X           (= calc-number-radix 10))
  1301. X          (setq buf (concat buf "  ("
  1302. X                (let ((calc-number-radix 16))
  1303. X                  (math-format-value (car alg-exp) 1000))
  1304. X                ", "
  1305. X                (let ((calc-number-radix 8))
  1306. X                  (math-format-value (car alg-exp) 1000))
  1307. X                (if (and (integerp (car alg-exp))
  1308. X                     (> (car alg-exp) 0)
  1309. X                     (< (car alg-exp) 127))
  1310. X                    (format ", \"%c\"" (car alg-exp))
  1311. X                  "")
  1312. X                ")")))
  1313. X      (if (and (< (length buf) (screen-width)) (= (length entry) 1)
  1314. X           calc-extensions-loaded)
  1315. X          (let ((long (concat (math-format-value (car entry) 1000)
  1316. X                  " =>  " buf)))
  1317. X        (if (<= (length long) (- (screen-width) 8))
  1318. X            (setq buf long))))
  1319. X      (calc-handle-whys)
  1320. X      (message "Result: %s" buf)))
  1321. X      (if (eq last-command-char 10)
  1322. X      (insert shortbuf)
  1323. X    (setq kill-ring (cons shortbuf kill-ring))
  1324. X    (if (> (length kill-ring) kill-ring-max)
  1325. X        (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil))
  1326. X    (setq kill-ring-yank-pointer kill-ring))))
  1327. )
  1328. X
  1329. (defun calc-do-calc-eval (str separator args)
  1330. X  (calc-check-defines)
  1331. X  (catch 'calc-error
  1332. X    (save-excursion
  1333. X      (calc-create-buffer)
  1334. X      (cond
  1335. X       ((and (consp str) (not (symbolp (car str))))
  1336. X    (let ((calc-language nil)
  1337. X          (math-expr-opers math-standard-opers)
  1338. X          (calc-internal-prec 12)
  1339. X          (calc-word-size 32)
  1340. X          (calc-symbolic-mode nil)
  1341. X          (calc-matrix-mode nil)
  1342. X          (calc-angle-mode 'deg)
  1343. X          (calc-number-radix 10)
  1344. X          (calc-leading-zeros nil)
  1345. X          (calc-group-digits nil)
  1346. X          (calc-point-char ".")
  1347. X          (calc-frac-format '(":" nil))
  1348. X          (calc-prefer-frac nil)
  1349. X          (calc-hms-format "%s@ %s' %s\"")
  1350. X          (calc-date-format '((H ":" mm C SS pp " ")
  1351. X                  Www " " Mmm " " D ", " YYYY))
  1352. X          (calc-float-format '(float 0))
  1353. X          (calc-full-float-format '(float 0))
  1354. X          (calc-complex-format nil)
  1355. X          (calc-matrix-just nil)
  1356. X          (calc-full-vectors t)
  1357. X          (calc-break-vectors nil)
  1358. X          (calc-vector-commas ",")
  1359. X          (calc-vector-brackets "[]")
  1360. X          (calc-matrix-brackets '(R O))
  1361. X          (calc-complex-mode 'cplx)
  1362. X          (calc-infinite-mode nil)
  1363. X          (calc-display-strings nil)
  1364. X          (calc-simplify-mode nil)
  1365. X          (calc-display-working-message 'lots)
  1366. X          (strp (cdr str)))
  1367. X      (while strp
  1368. X        (set (car strp) (nth 1 strp))
  1369. X        (setq strp (cdr (cdr strp))))
  1370. X      (calc-do-calc-eval (car str) separator args)))
  1371. X       ((eq separator 'eval)
  1372. X    (eval str))
  1373. X       ((eq separator 'macro)
  1374. X    (calc-extensions)
  1375. X    (let* ((calc-buffer (current-buffer))
  1376. X           (calc-window (get-buffer-window calc-buffer))
  1377. X           (save-window (selected-window)))
  1378. X      (if calc-window
  1379. X          (unwind-protect
  1380. X          (progn
  1381. X            (select-window calc-window)
  1382. X            (calc-execute-kbd-macro str nil (car args)))
  1383. X        (and (window-point save-window)
  1384. X             (select-window save-window)))
  1385. X        (save-window-excursion
  1386. X          (select-window (get-largest-window))
  1387. X          (switch-to-buffer calc-buffer)
  1388. X          (calc-execute-kbd-macro str nil (car args)))))
  1389. X    nil)
  1390. X       ((eq separator 'pop)
  1391. X    (or (not (integerp str))
  1392. X        (= str 0)
  1393. X        (calc-pop (min str (calc-stack-size))))
  1394. X    (calc-stack-size))
  1395. X       ((eq separator 'top)
  1396. X    (and (integerp str)
  1397. X         (> str 0)
  1398. X         (<= str (calc-stack-size))
  1399. X         (math-format-value (calc-top-n str (car args)) 1000)))
  1400. X       ((eq separator 'rawtop)
  1401. X    (and (integerp str)
  1402. X         (> str 0)
  1403. X         (<= str (calc-stack-size))
  1404. X         (calc-top-n str (car args))))
  1405. X       (t
  1406. X    (let* ((calc-command-flags nil)
  1407. X           (calc-next-why nil)
  1408. X           (calc-language (if (memq calc-language '(nil big))
  1409. X                  'flat calc-language))
  1410. X           (calc-dollar-values (mapcar
  1411. X                    (function
  1412. X                     (lambda (x)
  1413. X                       (if (stringp x)
  1414. X                       (progn
  1415. X                         (setq x (math-read-exprs x))
  1416. X                         (if (eq (car-safe x)
  1417. X                             'error)
  1418. X                         (throw 'calc-error
  1419. X                            (calc-eval-error
  1420. X                             (cdr x)))
  1421. X                           (car x)))
  1422. X                     x)))
  1423. X                    args))
  1424. X           (calc-dollar-used 0)
  1425. X           (res (if (stringp str)
  1426. X            (math-read-exprs str)
  1427. X              (list str)))
  1428. X           buf)
  1429. X      (if (eq (car res) 'error)
  1430. X          (calc-eval-error (cdr res))
  1431. X        (setq res (mapcar 'calc-normalize res))
  1432. X        (and (memq 'clear-message calc-command-flags)
  1433. X         (message ""))
  1434. X        (cond ((eq separator 'pred)
  1435. X           (if (= (length res) 1)
  1436. X               (math-is-true (car res))
  1437. X             (calc-eval-error '(0 "Single value expected"))))
  1438. X          ((eq separator 'raw)
  1439. X           (if (= (length res) 1)
  1440. X               (car res)
  1441. X             (calc-eval-error '(0 "Single value expected"))))
  1442. X          ((eq separator 'list)
  1443. X           res)
  1444. X          ((memq separator '(num rawnum))
  1445. X           (if (= (length res) 1)
  1446. X               (if (math-constp (car res))
  1447. X               (if (eq separator 'num)
  1448. X                   (math-format-value (car res) 1000)
  1449. X                 (car res))
  1450. X             (calc-eval-error
  1451. X              (list 0
  1452. X                (if calc-next-why
  1453. X                    (calc-explain-why (car calc-next-why))
  1454. X                  "Number expected"))))
  1455. X             (calc-eval-error '(0 "Single value expected"))))
  1456. X          ((eq separator 'push)
  1457. X           (calc-push-list res)
  1458. X           nil)
  1459. X          (t (while res
  1460. X               (setq buf (concat buf
  1461. X                     (and buf (or separator ", "))
  1462. X                     (math-format-value (car res) 1000))
  1463. X                 res (cdr res)))
  1464. X             buf))))))))
  1465. )
  1466. X
  1467. (defun calc-eval-error (msg)
  1468. X  (if (and (boundp 'calc-eval-error)
  1469. X       calc-eval-error)
  1470. X      (if (eq calc-eval-error 'string)
  1471. X      (nth 1 msg)
  1472. X    (error "%s" (nth 1 msg)))
  1473. X    msg)
  1474. )
  1475. X
  1476. X
  1477. ;;;; Reading an expression in algebraic form.
  1478. X
  1479. (defun calc-auto-algebraic-entry (&optional prefix)
  1480. X  (interactive "P")
  1481. X  (calc-algebraic-entry prefix t)
  1482. )
  1483. X
  1484. (defun calc-algebraic-entry (&optional prefix auto)
  1485. X  (interactive "P")
  1486. X  (calc-wrapper
  1487. X   (let ((calc-language (if prefix nil calc-language))
  1488. X     (math-expr-opers (if prefix math-standard-opers math-expr-opers)))
  1489. X     (calc-alg-entry (and auto (char-to-string last-command-char)))))
  1490. )
  1491. X
  1492. (defun calc-alg-entry (&optional initial prompt)
  1493. X  (let* ((sel-mode nil)
  1494. X     (calc-dollar-values (mapcar 'calc-get-stack-element
  1495. X                     (nthcdr calc-stack-top calc-stack)))
  1496. X     (calc-dollar-used 0)
  1497. X     (calc-plain-entry t)
  1498. X     (alg-exp (calc-do-alg-entry initial prompt t)))
  1499. X    (if (stringp alg-exp)
  1500. X    (progn
  1501. X      (calc-extensions)
  1502. X      (calc-alg-edit alg-exp))
  1503. X      (let* ((calc-simplify-mode (if (eq last-command-char ?\C-j)
  1504. X                     'none
  1505. X                   calc-simplify-mode))
  1506. X         (nvals (mapcar 'calc-normalize alg-exp)))
  1507. X    (while alg-exp
  1508. X      (calc-record (if calc-extensions-loaded (car alg-exp) (car nvals))
  1509. X               "alg'")
  1510. X      (calc-pop-push-record-list calc-dollar-used
  1511. X                     (and (not (equal (car alg-exp)
  1512. X                              (car nvals)))
  1513. X                      calc-extensions-loaded
  1514. X                      "")
  1515. X                     (list (car nvals)))
  1516. X      (setq alg-exp (cdr alg-exp)
  1517. X        nvals (cdr nvals)
  1518. X        calc-dollar-used 0)))
  1519. X      (calc-handle-whys)))
  1520. )
  1521. X
  1522. (defun calc-do-alg-entry (&optional initial prompt no-normalize)
  1523. X  (let* ((calc-buffer (current-buffer))
  1524. X     (blink-paren-hook 'calcAlg-blink-matching-open)
  1525. X     (alg-exp 'error))
  1526. X    (if (boundp 'calc-alg-ent-map)
  1527. X    ()
  1528. X      (setq calc-alg-ent-map (copy-keymap minibuffer-local-map))
  1529. X      (define-key calc-alg-ent-map "'" 'calcAlg-previous)
  1530. X      (define-key calc-alg-ent-map "`" 'calcAlg-edit)
  1531. X      (define-key calc-alg-ent-map "\C-m" 'calcAlg-enter)
  1532. X      (define-key calc-alg-ent-map "\C-j" 'calcAlg-enter)
  1533. X      (setq calc-alg-ent-esc-map (copy-keymap esc-map))
  1534. X      (let ((i 33))
  1535. X    (while (< i 127)
  1536. X      (aset calc-alg-ent-esc-map i 'calcAlg-escape)
  1537. X      (setq i (1+ i)))))
  1538. X    (define-key calc-alg-ent-map "\e" nil)
  1539. X    (if (eq calc-algebraic-mode 'total)
  1540. X    (define-key calc-alg-ent-map "\e" calc-alg-ent-esc-map)
  1541. X      (define-key calc-alg-ent-map "\ep" 'calcAlg-plus-minus)
  1542. X      (define-key calc-alg-ent-map "\em" 'calcAlg-mod))
  1543. X    (setq calc-aborted-prefix nil)
  1544. X    (let ((buf (read-from-minibuffer (or prompt "Algebraic: ")
  1545. X                     (or initial "")
  1546. X                     calc-alg-ent-map nil)))
  1547. X      (if (eq alg-exp 'error)
  1548. X      (if (eq (car-safe (setq alg-exp (math-read-exprs buf))) 'error)
  1549. X          (setq alg-exp nil)))
  1550. X      (setq calc-aborted-prefix "alg'")
  1551. X      (or no-normalize
  1552. X      (and alg-exp (setq alg-exp (mapcar 'calc-normalize alg-exp))))
  1553. X      alg-exp))
  1554. )
  1555. X
  1556. (defun calcAlg-plus-minus ()
  1557. X  (interactive)
  1558. X  (if (calc-minibuffer-contains ".* \\'")
  1559. X      (insert "+/- ")
  1560. X    (insert " +/- "))
  1561. )
  1562. X
  1563. (defun calcAlg-mod ()
  1564. X  (interactive)
  1565. X  (if (not (calc-minibuffer-contains ".* \\'"))
  1566. X      (insert " "))
  1567. X  (if (calc-minibuffer-contains ".* mod +\\'")
  1568. X      (if calc-previous-modulo
  1569. X      (insert (math-format-flat-expr calc-previous-modulo 0))
  1570. X    (beep))
  1571. X    (insert "mod "))
  1572. )
  1573. X
  1574. (defun calcAlg-previous ()
  1575. X  (interactive)
  1576. X  (if (calc-minibuffer-contains "\\`\\'")
  1577. X      (if calc-previous-alg-entry
  1578. X      (insert calc-previous-alg-entry)
  1579. X    (beep))
  1580. X    (insert "'"))
  1581. )
  1582. X
  1583. (defun calcAlg-escape ()
  1584. X  (interactive)
  1585. X  (setq unread-command-char last-command-char)
  1586. X  (save-excursion
  1587. X    (calc-select-buffer)
  1588. X    (use-local-map calc-mode-map))
  1589. X  (calcAlg-enter)
  1590. )
  1591. X
  1592. (defun calcAlg-edit ()
  1593. X  (interactive)
  1594. X  (if (or (not calc-plain-entry)
  1595. X      (calc-minibuffer-contains
  1596. X       "\\`\\([^\"]*\"[^\"]*\"\\)*[^\"]*\"[^\"]*\\'"))
  1597. X      (insert "`")
  1598. X    (setq alg-exp (buffer-string))
  1599. X    (and (> (length alg-exp) 0) (setq calc-previous-alg-entry alg-exp))
  1600. X    (exit-minibuffer))
  1601. )
  1602. (setq calc-plain-entry nil)
  1603. X
  1604. (defun calcAlg-enter ()
  1605. X  (interactive)
  1606. X  (let* ((str (buffer-string))
  1607. X     (exp (and (> (length str) 0)
  1608. X           (save-excursion
  1609. X             (set-buffer calc-buffer)
  1610. X             (math-read-exprs str)))))
  1611. X    (if (eq (car-safe exp) 'error)
  1612. X    (progn
  1613. X      (goto-char (point-min))
  1614. X      (forward-char (nth 1 exp))
  1615. X      (beep)
  1616. X      (calc-temp-minibuffer-message
  1617. X       (concat " [" (or (nth 2 exp) "Error") "]"))
  1618. X      (setq unread-command-char -1))
  1619. X      (setq alg-exp (if (calc-minibuffer-contains "\\` *\\[ *\\'")
  1620. X            '((incomplete vec))
  1621. X              exp))
  1622. X      (and (> (length str) 0) (setq calc-previous-alg-entry str))
  1623. X      (exit-minibuffer)))
  1624. )
  1625. X
  1626. (defun calcAlg-blink-matching-open ()
  1627. X  (let ((oldpos (point))
  1628. X    (blinkpos nil))
  1629. X    (save-excursion
  1630. X      (condition-case ()
  1631. X      (setq blinkpos (scan-sexps oldpos -1))
  1632. X    (error nil)))
  1633. X    (if (and blinkpos
  1634. X         (> oldpos (1+ (point-min)))
  1635. X         (or (and (= (char-after (1- oldpos)) ?\))
  1636. X              (= (char-after blinkpos) ?\[))
  1637. X         (and (= (char-after (1- oldpos)) ?\])
  1638. X              (= (char-after blinkpos) ?\()))
  1639. X         (save-excursion
  1640. X           (goto-char blinkpos)
  1641. X           (looking-at ".+\\(\\.\\.\\|\\\\dots\\|\\\\ldots\\)")))
  1642. X    (let ((saved (aref (syntax-table) (char-after blinkpos))))
  1643. X      (unwind-protect
  1644. X          (progn
  1645. X        (aset (syntax-table) (char-after blinkpos)
  1646. X              (+ (logand saved 255)
  1647. X             (lsh (char-after (1- oldpos)) 8)))
  1648. X        (blink-matching-open))
  1649. X        (aset (syntax-table) (char-after blinkpos) saved)))
  1650. X      (blink-matching-open)))
  1651. )
  1652. X
  1653. X
  1654. (defun calc-alg-digit-entry ()
  1655. X  (calc-alg-entry 
  1656. X   (cond ((eq last-command-char ?e)
  1657. X      (if (> calc-number-radix 14) (format "%d.^" calc-number-radix) "1e"))
  1658. X     ((eq last-command-char ?#) (format "%d#" calc-number-radix))
  1659. X     ((eq last-command-char ?_) "-")
  1660. X     ((eq last-command-char ?@) "0@ ")
  1661. X     (t (char-to-string last-command-char))))
  1662. )
  1663. X
  1664. (defun calcDigit-algebraic ()
  1665. X  (interactive)
  1666. X  (if (calc-minibuffer-contains ".*[@oh] *[^'m ]+[^'m]*\\'")
  1667. X      (calcDigit-key)
  1668. X    (setq calc-digit-value (buffer-string))
  1669. X    (exit-minibuffer))
  1670. )
  1671. X
  1672. (defun calcDigit-edit ()
  1673. X  (interactive)
  1674. X  (setq unread-command-char last-command-char)
  1675. X  (setq calc-digit-value (buffer-string))
  1676. X  (exit-minibuffer)
  1677. )
  1678. X
  1679. X
  1680. ;;; Algebraic expression parsing.   [Public]
  1681. X
  1682. (defun math-read-exprs (exp-str)
  1683. X  (let ((exp-pos 0)
  1684. X    (exp-old-pos 0)
  1685. X    (exp-keep-spaces nil)
  1686. X    exp-token exp-data)
  1687. X    (if calc-language-input-filter
  1688. X    (setq exp-str (funcall calc-language-input-filter exp-str)))
  1689. X    (while (setq exp-token (string-match "\\.\\." exp-str))
  1690. X      (setq exp-str (concat (substring exp-str 0 exp-token) "\\dots"
  1691. X                (substring exp-str (+ exp-token 2)))))
  1692. X    (math-read-token)
  1693. X    (let ((val (catch 'syntax (math-read-expr-list))))
  1694. X      (if (stringp val)
  1695. X      (list 'error exp-old-pos val)
  1696. X    (if (equal exp-token 'end)
  1697. X        val
  1698. X      (list 'error exp-old-pos "Syntax error")))))
  1699. )
  1700. X
  1701. (defun math-read-expr-list ()
  1702. X  (let* ((exp-keep-spaces nil)
  1703. X     (val (list (math-read-expr-level 0)))
  1704. X     (last val))
  1705. X    (while (equal exp-data ",")
  1706. X      (math-read-token)
  1707. X      (let ((rest (list (math-read-expr-level 0))))
  1708. X    (setcdr last rest)
  1709. X    (setq last rest)))
  1710. X    val)
  1711. )
  1712. X
  1713. (defun math-read-token ()
  1714. X  (if (>= exp-pos (length exp-str))
  1715. X      (setq exp-old-pos exp-pos
  1716. X        exp-token 'end
  1717. X        exp-data "\000")
  1718. X    (let ((ch (aref exp-str exp-pos)))
  1719. X      (setq exp-old-pos exp-pos)
  1720. X      (cond ((memq ch '(32 10 9))
  1721. X         (setq exp-pos (1+ exp-pos))
  1722. X         (if exp-keep-spaces
  1723. X         (setq exp-token 'space
  1724. X               exp-data " ")
  1725. X           (math-read-token)))
  1726. X        ((or (and (>= ch ?a) (<= ch ?z))
  1727. X         (and (>= ch ?A) (<= ch ?Z)))
  1728. X         (string-match (if (memq calc-language '(c fortran pascal maple))
  1729. X                   "[a-zA-Z0-9_#]*"
  1730. X                 "[a-zA-Z0-9'#]*")
  1731. X               exp-str exp-pos)
  1732. X         (setq exp-token 'symbol
  1733. X           exp-pos (match-end 0)
  1734. X           exp-data (math-restore-dashes
  1735. X                 (math-match-substring exp-str 0)))
  1736. X         (if (eq calc-language 'eqn)
  1737. X         (let ((code (assoc exp-data math-eqn-ignore-words)))
  1738. X           (cond ((null code))
  1739. X             ((null (cdr code))
  1740. X              (math-read-token))
  1741. X             ((consp (nth 1 code))
  1742. X              (math-read-token)
  1743. X              (if (assoc exp-data (cdr code))
  1744. X                  (setq exp-data (format "%s %s"
  1745. X                             (car code) exp-data))))
  1746. X             ((eq (nth 1 code) 'punc)
  1747. X              (setq exp-token 'punc
  1748. X                exp-data (nth 2 code)))
  1749. X             (t
  1750. X              (math-read-token)
  1751. X              (math-read-token))))))
  1752. X        ((or (and (>= ch ?0) (<= ch ?9))
  1753. X         (and (eq ch '?\.)
  1754. X              (eq (string-match "\\.[0-9]" exp-str exp-pos) exp-pos))
  1755. X         (and (eq ch '?_)
  1756. X              (eq (string-match "_\\.?[0-9]" exp-str exp-pos) exp-pos)
  1757. X              (or (eq exp-pos 0)
  1758. X              (and (memq calc-language '(nil flat big unform
  1759. X                             tex eqn))
  1760. X                   (eq (string-match "[^])}\"a-zA-Z0-9'$]_"
  1761. X                         exp-str (1- exp-pos))
  1762. X                   (1- exp-pos))))))
  1763. X         (or (and (eq calc-language 'c)
  1764. X              (string-match "0[xX][0-9a-fA-F]+" exp-str exp-pos))
  1765. X         (string-match "_?\\([0-9]+.?0*@ *\\)?\\([0-9]+.?0*' *\\)?\\(0*\\([2-9]\\|1[0-4]\\)\\(#\\|\\^\\^\\)[0-9a-dA-D.]+[eE][-+_]?[0-9]+\\|0*\\([2-9]\\|[0-2][0-9]\\|3[0-6]\\)\\(#\\|\\^\\^\\)[0-9a-zA-Z:.]+\\|[0-9]+:[0-9:]+\\|[0-9.]+\\([eE][-+_]?[0-9]+\\)?\"?\\)?" exp-str exp-pos))
  1766. X         (setq exp-token 'number
  1767. X           exp-data (math-match-substring exp-str 0)
  1768. X           exp-pos (match-end 0)))
  1769. X        ((eq ch ?\$)
  1770. X         (if (and (eq calc-language 'pascal)
  1771. X              (eq (string-match
  1772. X               "\\(\\$[0-9a-fA-F]+\\)\\($\\|[^0-9a-zA-Z]\\)"
  1773. X               exp-str exp-pos)
  1774. X              exp-pos))
  1775. X         (setq exp-token 'number
  1776. X               exp-data (math-match-substring exp-str 1)
  1777. X               exp-pos (match-end 1))
  1778. X           (if (eq (string-match "\\$\\([1-9][0-9]*\\)" exp-str exp-pos)
  1779. X               exp-pos)
  1780. X           (setq exp-data (- (string-to-int (math-match-substring
  1781. X                             exp-str 1))))
  1782. X         (string-match "\\$+" exp-str exp-pos)
  1783. X         (setq exp-data (- (match-end 0) (match-beginning 0))))
  1784. X           (setq exp-token 'dollar
  1785. X             exp-pos (match-end 0))))
  1786. X        ((eq ch ?\#)
  1787. X         (if (eq (string-match "#\\([1-9][0-9]*\\)" exp-str exp-pos)
  1788. X             exp-pos)
  1789. X         (setq exp-data (string-to-int
  1790. X                 (math-match-substring exp-str 1))
  1791. X               exp-pos (match-end 0))
  1792. X           (setq exp-data 1
  1793. X             exp-pos (1+ exp-pos)))
  1794. X         (setq exp-token 'hash))
  1795. X        ((eq (string-match "~=\\|<=\\|>=\\|<>\\|/=\\|\\+/-\\|\\\\dots\\|\\\\ldots\\|\\*\\*\\|<<\\|>>\\|==\\|!=\\|&&&\\||||\\|!!!\\|&&\\|||\\|!!\\|:=\\|::\\|=>"
  1796. X                   exp-str exp-pos)
  1797. X         exp-pos)
  1798. X         (setq exp-token 'punc
  1799. X           exp-data (math-match-substring exp-str 0)
  1800. X           exp-pos (match-end 0)))
  1801. X        ((and (eq ch ?\")
  1802. X          (string-match "\\(\"\\([^\"\\]\\|\\\\.\\)*\\)\\(\"\\|\\'\\)" exp-str exp-pos))
  1803. X         (if (eq calc-language 'eqn)
  1804. X         (progn
  1805. X           (setq exp-str (copy-sequence exp-str))
  1806. X           (aset exp-str (match-beginning 1) ?\{)
  1807. X           (if (< (match-end 1) (length exp-str))
  1808. X               (aset exp-str (match-end 1) ?\}))
  1809. X           (math-read-token))
  1810. X           (setq exp-token 'string
  1811. X             exp-data (math-match-substring exp-str 1)
  1812. X             exp-pos (match-end 0))))
  1813. X        ((and (= ch ?\\) (eq calc-language 'tex))
  1814. X         (or (string-match "\\\\hbox *{\\([a-zA-Z0-9]+\\)}" exp-str exp-pos)
  1815. X         (string-match "\\(\\\\\\([a-zA-Z]+\\|[^a-zA-Z]\\)\\)" exp-str exp-pos))
  1816. X         (setq exp-token 'symbol
  1817. X           exp-pos (match-end 0)
  1818. X           exp-data (math-restore-dashes
  1819. X                 (math-match-substring exp-str 1)))
  1820. X         (let ((code (assoc exp-data math-tex-ignore-words)))
  1821. X           (cond ((null code))
  1822. X             ((null (cdr code))
  1823. X              (math-read-token))
  1824. X             ((eq (nth 1 code) 'punc)
  1825. X              (setq exp-token 'punc
  1826. X                exp-data (nth 2 code)))
  1827. X             ((and (eq (nth 1 code) 'mat)
  1828. X               (string-match " *{" exp-str exp-pos))
  1829. X              (setq exp-pos (match-end 0)
  1830. X                exp-token 'punc
  1831. X                exp-data "[")
  1832. X              (let ((right (string-match "}" exp-str exp-pos)))
  1833. X            (and right
  1834. X                 (setq exp-str (copy-sequence exp-str))
  1835. X                 (aset exp-str right ?\])))))))
  1836. X        ((and (= ch ?\.) (eq calc-language 'fortran)
  1837. X          (eq (string-match "\\.[a-zA-Z][a-zA-Z][a-zA-Z]?\\."
  1838. X                    exp-str exp-pos) exp-pos))
  1839. X         (setq exp-token 'punc
  1840. SHAR_EOF
  1841. true || echo 'restore of calc-aent.el failed'
  1842. fi
  1843. echo 'End of  part 3'
  1844. echo 'File calc-aent.el is continued in part 4'
  1845. echo 4 > _shar_seq_.tmp
  1846. exit 0
  1847. exit 0 # Just in case...
  1848. -- 
  1849. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1850. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1851. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1852. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1853.